﻿using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;

namespace OnlineStore
{
    public static class FilePathTools
    {
        private static FilePath _filePath;

        public static FilePath GetFilePath()
        {
            return _filePath ?? (_filePath = new FilePath());
        }
    }

    /// <summary>
    /// 配置文件管理器
    /// </summary>
    public class FilePath
    {
        public FilePath()
        {
            RootPath = CheckTest()
                ? Directory.GetCurrentDirectory().Replace(@"\bin\Debug", "")
                : Directory.GetCurrentDirectory();

            //正式路径配置路径，使用基础路径拼接
            Config = RootPath + @"\Config\";
            Navigation = RootPath + @"\Navigation\";
            Order = RootPath + @"\Order\";
            //默认配置路径拼接，使用基础路径拼接
            DefaultConfig = RootPath + @"\Default\Config\";
            DefaultNavigation = RootPath + @"\Default\Navigation\";
            DefaultOrder = RootPath + @"\Default\Order\";
            First = RootPath + @"\Default\first.txt";
            //使用 config 拼接
            CarPic = Config + @"carPic.txt";
            UserConfig = Config + @"userConfig.json";
            PwSttingConfig = Config + @"pwSettingConfig.json";
            TasksConfig = Config + @"tasksConfig.json";
            SettingConfig = Config + @"settingConfig.json";
            //使用 navigation 拼接
            TaobaoNavigation = Navigation + @"taobaoNavigation.json";
            TianmaoNavigation = Navigation + @"tianmaoNavigation.json";
            PinduoduoNavigation = Navigation + @"pinduoduoNavigation.json";
            //设置文件目录列表
            NavigationFiles = GetFileNameForDir(Navigation);
            ConfigFiles = GetFileNameForDir(Config);
            OrderFiles = GetFileNameForDir(Order);
        }

        /// <summary>
        /// 当前执行路径
        /// </summary>
        private string RootPath { get; set; }

        /// <summary>
        /// 配置【文件夹】路径
        /// </summary>
        public string Config { get; private set; }

        /// <summary>
        /// 导航【文件夹】路径
        /// </summary>
        public string Navigation { get; private set; }

        /// <summary>
        /// 命令【文件夹】路径
        /// </summary>
        public string Order { get; private set; }

        //Default
        /// <summary>
        /// 默认配置【文件夹】路径
        /// </summary>
        private string DefaultConfig { get; set; }

        /// <summary>
        /// 默认导航【文件夹】路径
        /// </summary>
        private string DefaultNavigation { get; set; }

        /// <summary>
        /// 默认命令【文件夹】路径
        /// </summary>
        public string DefaultOrder { get; private set; }

        //Config
        /// <summary>
        /// 车型图片名称 文件 路径
        /// </summary>
        public string CarPic { get; private set; }

        /// <summary>
        /// 账号 文件 路径
        /// </summary>
        public string UserConfig { get; private set; }

        /// <summary>
        /// 驱动设置 文件 路径
        /// </summary>
        public string PwSttingConfig { get; private set; }

        /// <summary>
        /// 任务设置 文件 路径
        /// </summary>
        public string TasksConfig { get; private set; }

        /// <summary>
        /// 任务设置 文件 路径
        /// </summary>
        public string SettingConfig { get; private set; }

        //Navigation
        /// <summary>
        /// 淘宝驱动导航 文件 路径
        /// </summary>
        public string TaobaoNavigation { get; private set; }

        public string TianmaoNavigation { get; private set; }
        public string PinduoduoNavigation { get; private set; }

        //first
        /// <summary>
        /// 是否为安装后首次运行 文件 路径
        /// </summary>
        private string First { get; set; }

        /// <summary>
        /// navigation 目录中的所有文件名称列表（不带路径）
        /// </summary>
        public string[] NavigationFiles { get; private set; }

        /// <summary>
        /// config 目录中的所有文件名称列表（不带路径）
        /// </summary>
        public string[] ConfigFiles { get; private set; }

        /// <summary>
        /// order 目录中的所有文件名称列表（不带路径）
        /// </summary>
        public string[] OrderFiles { get; private set; }

        /// <summary>
        /// 判断是否为安装后首次运行，如果是，则检查配置文件是否存在异常，执行检查完毕后，删除首次运行校验文件
        /// </summary>
        public void CheckFirst()
        {
            if (!File.Exists(First)) return;
            string isFirst = File.ReadAllText(First).Trim();
            if (isFirst == "0") return;

            CheckFiles(DefaultConfig, Config);
            CheckFiles(DefaultNavigation, Navigation);

            if (UpdateFiles.Configs.Length > 0)
            {
                foreach (var json in UpdateFiles.Configs)
                {
                    string outfile = $"{Config}{json.Trim()}";
                    string infile = $"{DefaultConfig}{json.Trim()}";
                    File.Copy(infile, outfile, true);
                }
            }

            if (UpdateFiles.Navigation.Length > 0)
            {
                foreach (var json in UpdateFiles.Navigation)
                {
                    string outfile = $"{Navigation}{json.Trim()}";
                    string infile = $"{DefaultNavigation}{json.Trim()}";
                    File.Copy(infile, outfile, true);
                }
            }

            File.WriteAllText(First, "0");
        }

        /// <summary>
        /// 判断目录是否存在，不存在则谈警告窗口
        /// </summary>
        /// <param name="dir">指定的目录路径</param>
        /// <returns>返回检查结果，不存在返回false</returns>
        private bool CheckDir(string dir)
        {
            if (!Directory.Exists(dir))
            {
                MessageBox.Show($"警告！目录不存在【{dir}】");
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// 获取指定目录中的所有文件名称（不包含路径）
        /// </summary>
        /// <param name="dir">指定的目录路径</param>
        /// <returns>返回目录中的所有文件名称</returns>
        private string[] GetFileNameForDir(string dir)
        {
            List<string> fileList = new List<string>();
            if (CheckDir(dir))
            {
                string[] filesArray = Directory.GetFiles(dir);
                if (filesArray.Length > 0)
                {
                    foreach (var fileItem in filesArray)
                    {
                        fileList.Add(Path.GetFileName(fileItem));
                    }
                }

                return fileList.ToArray();
            }
            else
            {
                return new string[] { };
            }
        }

        /// <summary>
        /// 检查目标文件夹与源文件夹是否存在差异，如果有差异，则将源文件夹中的文件复制到目标文件夹中
        /// </summary>
        /// <param name="sourceDir">源文件夹</param>
        /// <param name="targetDir">目标文件夹</param>
        private void CheckFiles(string sourceDir, string targetDir)
        {
            if (!Directory.Exists(targetDir))
            {
                Directory.CreateDirectory(targetDir);
                string[] sourceFiles = Directory.GetFiles(sourceDir);
                foreach (string sourceFile in sourceFiles)
                {
                    string targetFile = targetDir + sourceFile.Replace(sourceDir, "");
                    File.Copy(sourceFile, targetFile, true);
                }
            }
            else
            {
                string[] targetFiles = Directory.GetFiles(targetDir);
                string[] sourceFiles = Directory.GetFiles(sourceDir);
                if (targetFiles.Length != sourceFiles.Length)
                {
                    foreach (string sourceFile in sourceFiles)
                    {
                        string targetFile = targetDir + sourceFile.Replace(sourceDir, "");
                        if (!File.Exists(targetFile))
                        {
                            File.Copy(sourceFile, targetFile);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 判断是否为测试模式
        /// </summary>
        /// <returns></returns>
        private bool CheckTest()
        {
            string path = Directory.GetCurrentDirectory() + @"\test.txt";
            if (File.Exists(path)) return true;
            return false;
        }

        /// <summary>
        /// 删除执行路径目录
        /// </summary>
        /// <param name="path">需要删除的目录路径</param>
        public void CleanDir(string path)
        {
            Directory.Delete(path, true);
        }
    }
}